package com.cwt.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;

/**
 * @author chenwt
 * @version V1.0
 * @describe 【】
 * @date 2023年06月14日 11:56:01
 */
public class FileUtils extends org.apache.commons.io.FileUtils {

    private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);

    /**
     * 读取文件 信息
     * @param file 文件
     * @return 文件数据
     */
    public static String readFileToStr(File file) throws Exception {
        StringBuilder xmlStr = new StringBuilder(); // xml 文件字符串
        FileInputStream fis = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try {
            fis = new FileInputStream(file);
            isr = new InputStreamReader(fis);
            br = new BufferedReader(isr);
            String line = "";
            while (StringUtils.isNotBlank(line = br.readLine())) {
                xmlStr.append(line);
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            if (!ObjectUtils.isEmpty(br)) br.close();
            if (!ObjectUtils.isEmpty(isr)) isr.close();
            if (!ObjectUtils.isEmpty(fis)) fis.close();
        }
        return xmlStr.toString();
    }

    /**
     * 创建文件
     * @param fileName 文件名称
     * @param fileData 文件待写入数据
     * @return 文件
     */
    public static File createFile(String fileName, String fileData) {
        File file = new File(fileName);
        try {
            FileWriter writer = new FileWriter(file);
            writer.write(fileData);
            writer.close();
        } catch (IOException e) {
            logger.error("创建文件异常", e);
        }
        return file;
    }

    /**
     * 创建文件 并进行覆盖
     * @param oldPath  待移除文件路径
     * @param newPath  文件名称
     * @param fileData 文件待写入数据
     * @return 创建文件 并进行覆盖
     */
    public static File createFileAndCover(String oldPath, String newPath, String fileData) {
        if (!deleteFile(oldPath)) {
            return null;
        }
        return createFile(newPath, fileData);
    }

    /**
     * 移除文件
     * @param filePath 文件路径
     * @return 移除文件
     */
    public static boolean deleteFile(String filePath) {
        File file = new File(filePath);
        if (file.exists()) {
            return file.delete();
        }
        return false;
    }

    /**
     * 获取 resource 下文件的 绝对路径
     * @param path resource 文件目录
     * @return 绝对路径
     */
    public static String getResourceAbsolutePath(String path) {
        String localPath = ""; // 流程文件路径
        try {
            Resource resource = new PathMatchingResourcePatternResolver().getResource(path);
            File file = new File(resource.getURL().getFile());
            if (file.exists()) {
                localPath = file.getAbsolutePath();
            }
        } catch (IOException e) {
            logger.error("Resource 目录文件读取失败", e);
        }
        return localPath;
    }

    /**
     * 清空文件内容并写入
     * @param fileName 文件名称
     * @param fileData 文件内容
     * @return 清空文件内容并写入
     */
    public static boolean clearFileAndWrite(String fileName, String fileData) {
        File file = new File(fileName);
        if (!file.exists()) {
            return false;
        }

        try {
            FileWriter fw = new FileWriter(file);
            fw.write("");
            fw.flush();
            fw.close();

            fw = new FileWriter(file);
            fw.write(fileData);
            fw.flush();
            fw.close();
            return true;
        } catch (IOException e) {
            logger.error("文件重写数据异常", e);
        }
        return false;
    }

    /**
     * 创建文件
     * @param file 文件
     * @param filePath 文件待写入路径
     * @return 文件
     */
    public static File createFile(MultipartFile file, String filePath) {
        // 创建目标文件
        File outputFile = new File(filePath);
        try {
            if (outputFile.exists()) {
                if (!outputFile.delete()) {
                    return outputFile;
                }
            }
            FileUtils.writeByteArrayToFile(outputFile, file.getBytes());
        } catch (IOException e) {
            logger.error("文件上传异常", e);
        }
        return outputFile;
    }

}
